package com.yuanheng100.ems4j.api;

import com.riversoft.weixin.qy.contact.tag.TagUsersResult;
import com.yuanheng100.ems4j.model.*;

import java.util.List;
import java.util.Map;

/**
 * Created by jlqian on 2017/1/16.
 */
public interface IWeChatService
{
    /**
     * 创建部门
     *
     * @param name     部门名称。长度限制为32个字（汉字或英文字母），字符不能包括\:*?"<>｜
     * @param parentId 父亲部门id。根部门id为1
     * @param order    在父部门中的次序值。order值小的排序靠前。
     * @param id       部门id，整型。指定时必须大于1，不指定时则自动生成
     */
    void createDepartment(String name, Integer parentId, Integer order, Integer id);

    /**
     * 更新部门
     *
     * @param id       部门id
     * @param name     部门名称。长度限制为32个字（汉字或英文字母），字符不能包括\:*?"<>｜
     * @param parentId 父亲部门id。根部门id为1
     * @param order    在父部门中的次序值。order值小的排序靠前。
     */
    void updateDepartment(Integer id, String name, Integer parentId, Integer order);

    /**
     * 删除部门
     *
     * @param id 部门id。（注：不能删除根部门；不能删除含有子部门、成员的部门）
     */
    void deleteDepartment(Integer id);

    /**
     * 获取部门列表
     *
     * @param id 部门id。获取指定部门及其下的子部门
     */
    List<Ems4jDepartment> listDepartment(Integer id);

    /**
     * 创建标签
     *
     * @param tagname 标签名称，长度限制为32个字（汉字或英文字母），标签名不可与其他标签重名。
     * @param tagid   标签id，整型，指定此参数时新增的标签会生成对应的标签id，不指定时则以目前最大的id自增。
     */
    void createRole(String tagname, Integer tagid);

    /**
     * 更新标签名字
     *
     * @param tagid   标签ID
     * @param tagname 标签名称，长度限制为32个字（汉字或英文字母），标签不可与其他标签重名。
     */
    void updateRole(Integer tagid, String tagname);

    /**
     * 删除标签
     *
     * @param tagid 标签ID 注:标签的成员列表为空。
     */
    void deleteRole(Integer tagid);

    /**
     * 获取标签列表
     */
    List<Ems4jRole> listRole();

    /**
     * 创建成员
     *
     * @param userId        成员UserID。对应管理端的帐号，企业内必须唯一。不区分大小写，长度为1~64个字节
     * @param name          成员名称。长度为1~64个字节
     * @param department    成员所属部门id列表,不超过20个
     * @param position      职位信息。长度为0~64个字节
     * @param mobile        手机号码。企业内必须唯一，mobile/weixinid/email三者不能同时为空
     * @param gender        性别。1表示男性，2表示女性
     * @param email         邮箱。长度为0~64个字节。企业内必须唯一
     * @param weixinId      微信号。企业内必须唯一。（注意：是微信号，不是微信的名字）
     * @param avatarMediaId 成员头像的mediaid，通过多媒体接口上传图片获得的mediaid
     * @param extAttr       扩展属性。扩展属性需要在WEB管理端创建后才生效，否则忽略未知属性的赋值
     */
    void createUser(String userId, String name, int[] department, String position, String mobile, Short gender, String email, String weixinId, String avatarMediaId, Map<String, String> extAttr);

    /**
     * 更新成员
     *
     * @param userId        成员UserID。对应管理端的帐号，企业内必须唯一。不区分大小写，长度为1~64个字节
     * @param name          成员名称。长度为1~64个字节
     * @param department    成员所属部门id列表,不超过20个
     * @param position      职位信息。长度为0~64个字节
     * @param mobile        手机号码。企业内必须唯一，mobile/weixinid/email三者不能同时为空
     * @param gender        性别。1表示男性，2表示女性
     * @param email         邮箱。长度为0~64个字节。企业内必须唯一
     * @param weixinId      微信号。企业内必须唯一。（注意：是微信号，不是微信的名字）
     * @param enable        启用/禁用成员
     * @param avatarMediaId 成员头像的mediaid，通过多媒体接口上传图片获得的mediaid
     * @param extAttr       扩展属性。扩展属性需要在WEB管理端创建后才生效，否则忽略未知属性的赋值
     */
    void updateUser(String userId, String name, int[] department, String position, String mobile, Short gender, String email, String weixinId, Boolean enable, String avatarMediaId, Map<String, String> extAttr);


    /**
     * 删除成员
     *
     * @param userId 成员UserID。对应管理端的帐号，企业内必须唯一。不区分大小写，长度为1~64个字节
     */
    void deleteUser(String userId);

    /**
     * 批量删除成员
     *
     * @param userIds 成员UserID列表。对应管理端的帐号。（最多支持200个）
     */
    void batchDeleteUser(List<String> userIds);

    /**
     * 获取成员
     *
     * @param userId 成员UserID。对应管理端的帐号
     * @return
     */
    Ems4jEmployee getUser(String userId);

    /**
     * 获取部门成员
     *
     * @param departmentId 获取的部门id
     * @param fetchChild   是否递归获取子部门下面的成员
     * @return
     */
    List<Ems4jEmployee> getDepartmentUser(Integer departmentId, Boolean fetchChild);

    /**
     * 获取部门成员(详情)
     *
     * @param departmentId 获取的部门id
     * @param fetchChild   是否递归获取子部门下面的成员
     * @return
     */
    List<Ems4jEmployee> getDepartmentUserDetails(Integer departmentId, Boolean fetchChild);

    /**
     * 获取标签成员
     *
     * @param tagid 标签ID
     * @return
     */
    List<Ems4jEmployee> getTagUser(Integer tagid);

    /**
     * 增加标签成员
     *
     * @param tagid     标签ID
     * @param userlist  企业成员ID列表，注意：userlist、partylist不能同时为空，单次请求长度不超过1000
     * @param partylist 企业部门ID列表，注意：userlist、partylist不能同时为空，单次请求长度不超过100
     * @return
     */
    TagUsersResult addTagUser(Integer tagid, List<String> userlist, List<Integer> partylist);

    /**
     * 删除标签成员
     *
     * @param tagid     标签ID
     * @param userlist  企业成员ID列表，注意：userlist、partylist不能同时为空
     * @param partylist 企业部门ID列表，注意：userlist、partylist不能同时为空
     * @return
     */
    TagUsersResult delTagUser(Integer tagid, List<String> userlist, List<Integer> partylist);

    /**
     * 发送微信文本消息
     *
     * @param touser  成员ID列表（消息接收者，多个接收者用‘|’分隔，最多支持1000个）。特殊情况：指定为@all，则向关注该企业应用的全部成员发送
     * @param toparty 部门ID列表，多个接收者用‘|’分隔，最多支持100个。当touser为@all时忽略本参数
     * @param totag   标签ID列表，多个接收者用‘|’分隔，最多支持100个。当touser为@all时忽略本参数
     * @param agentid 企业应用的id，整型。可在应用的设置页面查看
     * @param safe    表示是否是保密消息，默认不保密
     * @param content 消息内容，最长不超过2048个字节，注意：主页型应用推送的文本消息在微信端最多只显示20个字（包含中英文）
     */
    void sendTextMsg(String touser, String toparty, String totag, Integer agentid, Boolean safe, String content);

    /**
     * 发送微信文本消息
     *
     * @param ems4jWeChat
     */
    void sendTextMsg(Ems4jWeChat ems4jWeChat);

    /**
     * 发送微信图片消息
     *
     * @param touser   成员ID列表（消息接收者，多个接收者用‘|’分隔，最多支持1000个）。特殊情况：指定为@all，则向关注该企业应用的全部成员发送
     * @param toparty  部门ID列表，多个接收者用‘|’分隔，最多支持100个。当touser为@all时忽略本参数
     * @param totag    标签ID列表，多个接收者用‘|’分隔，最多支持100个。当touser为@all时忽略本参数
     * @param agentid  企业应用的id，整型。可在应用的设置页面查看
     * @param safe     表示是否是保密消息，默认不保密
     * @param media_id 图片媒体文件id，可以调用上传临时素材或者永久素材接口获取,永久素材media_id必须由发消息的应用创建
     */
    void sendImageMsg(String touser, String toparty, String totag, Integer agentid, Boolean safe, String media_id);

    /**
     * 发送微信图片消息
     *
     * @param ems4jWeChat
     */
    void sendImageMsg(Ems4jWeChat ems4jWeChat);

    /**
     * 根据查询条件，查找符合条件的结果，并进行分页
     *
     * @param page
     * @param conditions
     */
    void getPage(Ems4jPage<Ems4jWeChat> page, Map<String, Object> conditions);


}
